草庐IT

c++ - CppUnit泄漏

全部标签

c# - 忽略 IDisposable 会导致内存泄漏吗?

在answerIwrote的评论中我们讨论了内存泄漏和IDisposable,但我们没有得出任何真正的结论。处理非托管资源的类可能会实现IDisposable。如果忽略它并且既不调用Dispose也不将对象包装在using中-这会导致非托管资源被泄漏吗?还是会在GC回收对象的时候进行适当的清理?我们可以假设处理非托管资源的类具有IDisposable的正确实现,包括终结器等。 最佳答案 它不会导致内存泄漏。事实上,Dispose与内存管理完全无关。它将造成资源泄漏。虽然GC通常会清理它,但这可能太少也太晚了。省略Dispose(us

c# - 如何检测内存泄漏在哪里?

我有一个大型网站,似乎正在占用所有分配的内存。服务器上除此站点外没有其他任何内容。一周之内,它会耗尽2个演出并需要重新启动。目前这是使用IIS7的服务器200832位。我们正在重新安装以使用64位并添加更多内存。如果能够追踪泄漏发生的位置,那就太好了。那么跟踪内存泄漏的最佳实践是什么? 最佳答案 内存泄漏在.NET中并不常见,但当它们发生时,最常见的原因是未附加的事件处理程序。确保在监听器超出范围之前分离处理程序。另一种选择是,如果您忘记在IDisposable资源上调用Dispose()。这可能会阻止清理非托管资源(不由GC处理)

c# - ConcurrentBag<T> 实现中是否存在内存泄漏?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:PossiblememoryleakinConcurrentBag?编辑1:真正的问题是。你能证实这一点吗?还是我的样本有误,我遗漏了一些明显的东西?我认为ConcurrentBag是无序列表的简单替代品。但是我错了。ConcurrentBag确实将自己作为ThreadLocal添加到创建线程,这基本上会导致内存泄漏。classProgram{staticvoidMain(string[]args){varstart=GC.GetTotalMemory(true);newProgram().Start(arg

c# - Release模式下 Console.SetOut 的问题?

我的代码中有一堆Console.WriteLines,我可以在运行时观察它们。我与我也编写的native库进行通信。我想在native库中添加一些printf并观察它们。但是我在运行时看不到它们。我创建了一个复杂的helloworld应用程序来演示我的问题。当应用程序运行时,我可以调试到native库并看到调用了helloworld。但是,输出永远不会出现在文本编写器中。请注意,如果相同的代码作为控制台应用程序运行,则一切正常。C#:[DllImport("native.dll")]staticexternvoidTest();StreamWriterwriter;publicForm

c# - 奇怪的 handle 泄漏

我的应用程序(基本应用程序是与C++/CLI互操作的MFC,但它还包含大量C#、Windows窗体、WPF)有句柄泄漏。应用程序启动后不久,我可以看到任务管理器中的句柄数持续增长(以每秒10个新句柄的速度)。所以我用了handles.exe看看它们是什么类型的句柄。我发现泄漏的句柄是进程句柄。它们是我的应用程序进程的进程句柄。所以我想知道哪些操作通常会为其运行的进程创建句柄。有什么想法吗?你见过这样的事吗?考虑到我不能使用调试DLL并且我只能使用可以xcopy部署的工具,我还能做些什么来追踪泄漏。更新:我能够向它抛出windbg和!handle,!htrace并发现进程句柄都是使用以下

C# 基于事件的内存泄漏

我有一个应用程序,由于在对象引用设置为null之前未分离事件而导致一些内存泄漏。应用程序很大,很难通过查看代码找到内存泄漏。我想使用sos.dll查找作为泄漏源的方法的名称,但我被卡住了。我建立了一个测试项目来演示这个问题。这里我有2个类,一个有一个事件,并且如下所示监听该事件namespaceMemoryLeak{classProgram{staticvoidMain(string[]args){TestMemoryLeaktestMemoryLeak=newTestMemoryLeak();while(!Console.ReadKey().Key.Equals('q')){}}}c

c# - 在 C 和 C# 中将 int 提升为 unsigned int

看看这段C代码:intmain(){unsignedinty=10;intx=-2;if(x>y)printf("xisgreater");elseprintf("yisgreater");return0;}/*Output:xisgreater.*/我明白为什么输出的x更大,因为当计算机比较两者时,x被提升为无符号整数类型。当x提升为无符号整数时,-2变为65534,这肯定大于10。但为什么在C#中,等效代码会给出相反的结果?publicstaticvoidMain(String[]args){uinty=10;intx=-2;if(x>y){Console.WriteLine("x

c# - 使用 "greater than or equals"或仅使用 "greater than"

我记得从C天起我们就被鼓励使用i>-1代替i>=0因为性能。这是否仍然适用于C#.NET世界?在当今的编译器中使用其中一种对性能有何影响?即编译器是否足够聪明,可以为您优化这些?(顺便说一句,尝试在StackOverflow的问题字段中输入问题“use>=or>”,看看会发生什么。) 最佳答案 不,没有与比较运算符相关的性能问题。无论如何,任何好的编译器都会优化这种微不足道的东西。我不确定您从哪里得到使用“i>-1”而不是“i>=0”的建议。在x86体系结构上,使用哪一种都没有区别:两种情况都恰好需要两条指令......一条用于比较

c# - .NET JIT 代码缓存泄漏?

我们有一个用.Net3.5编写的服务器组件。它在WindowsServer2008StandardEdition上作为服务运行。它工作得很好,但在一段时间(几天)后,我们注意到速度大幅下降和工作集增加。我们预计会发生某种内存泄漏,并使用WinDBG/SOS来分析进程的转储。不幸的是,GC堆没有显示任何泄漏,但我们注意到JIT代码堆已经从开始后的8MB增长到几天后的1GB以上。我们自己不使用任何动态代码生成技术。我们使用以动态代码生成而闻名的Linq2SQL,但我们不知道它是否会导致这样的问题。主要问题是是否有任何技术可以分析转储并检查WinDBG转储中显示的所有主机代码堆block来自

c# - 单元测试内存泄漏

我有一个存在大量内存泄漏的应用程序。例如,如果打开一个View并将其关闭10次,我的内存消耗会增加,因为View没有完全清理。这些是我的内存泄漏。从测试驱动的角度来看,我想编写一个测试来证明我的泄漏,并且(在我修复泄漏之后)断言我修复了它。这样我的代码以后就不会被破坏。简而言之:有没有办法断言我的代码没有从单元测试中泄漏内存?例如我可以做这样的事情吗:objectsThatShouldNotBeThereCount=MemAssertion.GetObjects().Count;Assert.AreEqual(0,objectsThatShouldNotBeThereCount);我对